﻿using System;
using System.Collections.Generic;
using br.com.SistemaChamados.DAO.Common;
using br.com.SistemaChamados.Enum;
using br.com.SistemaChamados.Model.Common;

namespace br.com.SistemaChamados.Controller.Common
{
    public class UserController
    {
        /// <summary>
        /// Método responsável por inserir um usuário
        /// </summary>
        /// <param name="user">O usuário a ser inserido</param>
        /// <returns>EnumGenericState</returns>
        public EnumGenericState InsertUser(User user)
        {
            EnumGenericState stateTransaction = EnumGenericState.GENERIC_STATE_UNKNOW;
            try
            {
                stateTransaction = UserDAO.InsertUser(user);
            }
            catch (Exception ex)
            {
                stateTransaction = EnumGenericState.GENERIC_STATE_FAILED;
                throw ex;
            }
            return stateTransaction;
        }

        /// <summary>
        /// Método responsável por atualizar um usuário
        /// </summary>
        /// <param name="user">Usuário com as informações atualizadas</param>
        /// <returns>EnumGenericState</returns>
        public EnumGenericState UpdateUser(User user)
        {
            EnumGenericState stateTransaction = EnumGenericState.GENERIC_STATE_UNKNOW;
            try
            {
                stateTransaction = UserDAO.UpdateUser(user);
            }
            catch (Exception ex)
            {
                stateTransaction = EnumGenericState.GENERIC_STATE_FAILED;
                throw ex;
            }
            return stateTransaction;
        }

        /// <summary>
        /// Método responsável por remover um usuário
        /// </summary>
        /// <param name="user">O usuário a ser removido</param>
        /// <returns>EnumGenericState</returns>
        public EnumGenericState DeleteUser(User user)
        {
            EnumGenericState stateTransaction = EnumGenericState.GENERIC_STATE_UNKNOW;
            try
            {
                stateTransaction = UserDAO.DeleteUser(user);
            }
            catch (Exception ex)
            {
                stateTransaction = EnumGenericState.GENERIC_STATE_FAILED;
                throw ex;
            }
            return stateTransaction;
        }

        /// <summary>
        /// Método responsável por retornar um usuário específico
        /// </summary>
        /// <param name="user">O usuário com o Id a ser recuperado</param>
        /// <returns>User</returns>
        public User GetUser(User user)
        {
            User ValidateUserSelected = new User();
            try
            {
                ValidateUserSelected = UserDAO.getUser(user.Id);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return ValidateUserSelected;
        }

        /// <summary>
        /// Método responsável por recuperar todos os usuários
        /// </summary>
        /// <returns>List - User</returns>
        public List<User> GetUsers()
        {
            List<User> Returnedlist = new List<User>();

            try
            {
                Returnedlist = UserDAO.getUsers();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return Returnedlist;
        }

        /// <summary>
        /// Método responsável por listar todos os usuários por um perfil de acesso
        /// </summary>
        /// <param name="role">String que identifica o perfil desejado</param>
        /// <returns>List - User</returns>
        public List<User> GetUsersByRole(string role)
        {
            List<User> Returnedlist = new List<User>();

            try
            {
                Returnedlist = UserDAO.GetUsersByRole(role);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return Returnedlist;
        }

        /// <summary>
        /// Método responsável por verificar a autenticidade de um usuário
        /// </summary>
        /// <param name="user">O usuário a ser verificado</param>
        /// <returns>EnumUserState</returns>
        public EnumUserState validateUser(ref User user)
        {
            EnumUserState resultState = EnumUserState.USER_STATE_UNKNOW;
            try
            {
                user = UserDAO.validateUser(user);
                if (user.Id == 0)
                {
                    resultState = EnumUserState.USER_STATE_INVALID;
                }
                else
                {
                    resultState = EnumUserState.USER_STATE_LOGGED_IN;
                }
            }
            catch (Exception ex)
            {
                resultState = EnumUserState.USER_STATE_UNKNOW;
                throw ex;
            }
            return resultState;
        }

        /// <summary>
        /// Método responsável por recuperar um usuário pelo nome e pelo email
        /// </summary>
        /// <param name="name">Nome do usuário</param>
        /// <param name="email">Email (login) do usuário</param>
        /// <returns>User</returns>
        public User getUserByNameAndEmail(string name, string email)
        {
            try
            {
                User user = UserDAO.GetUserByNameAndEmail(name, email);
                return user;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Método responsável por retonar um usuário por seu login (email)
        /// </summary>
        /// <param name="email">Email (login) do usuário</param>
        /// <returns>User</returns>
        public User getUserByEmail(string email)
        {
            try
            {
                User user = UserDAO.GetUserByEmail(email);
                return user;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

    }
}
